package pe.edu.upc.e41a.javasoft.jsf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.CloseEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;

import pe.edu.upc.e41a.javasoft.domain.Aviso;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;
import pe.edu.upc.e41a.javasoft.domain.TipoDocumento;
import pe.edu.upc.e41a.javasoft.domain.TipoPersona;
import pe.edu.upc.e41a.javasoft.domain.Transaccion;
import pe.edu.upc.e41a.javasoft.domain.Usuario;
import pe.edu.upc.e41a.javasoft.jsf.converter.TipoPersonaConverter;
import pe.edu.upc.e41a.javasoft.service.TipoDocumentoService;
import pe.edu.upc.e41a.javasoft.service.TipoPersonaService;
import pe.edu.upc.e41a.javasoft.service.UsuarioService;


@ManagedBean(name = "usuarioBean")
@SessionScoped
@Configurable
@RooSerializable
@RooJsfManagedBean(entity = Usuario.class, beanName = "usuarioBean")
public class UsuarioBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
    UsuarioService usuarioService;

	@Autowired
    TipoPersonaService tipoPersonaService;

	@Autowired
    TipoDocumentoService tipoDocumentoService;

	private String name = "Usuarios";

	private Usuario usuario;
	private Usuario usuarioSession;

	private List<Usuario> allUsuarios;
	
	;
	private TipoPersonaConverter tipoPersonaConverter;
	
	
	public TipoPersonaConverter getTipoPersonaConverter() {
		if (tipoPersonaConverter == null) {
			tipoPersonaConverter = new TipoPersonaConverter();
        }

		return tipoPersonaConverter;
	}

	public void setTipoPersonaConverter(TipoPersonaConverter tipoPersonaConverter) {
		this.tipoPersonaConverter = tipoPersonaConverter;
	}

	private TipoPersona selectedTipoPersona;
	private List<TipoPersona> listaTipoPersona;
	private String idTipoPersona;
	
	
	private TipoDocumento selectedTipoDocumento;
	private List<TipoDocumento>listaTipoDocumento;
	private String idTipoDocumento;

	private boolean dataVisible = false;

	private List<String> columns;

	private boolean createDialogVisible = false;

	private List<Aviso> selectedAvisoes;

	private List<Publicacion> selectedPublicacions;

	private List<Transaccion> selectedTransaccions;

	@PostConstruct
    public void init() {
        columns = new ArrayList<String>();
        columns.add("nombres");
        columns.add("apellidoPaterno");
        columns.add("apellidoMaterno");
        columns.add("sexo");
        columns.add("numeroDocumento");

		this.llenarCombosUsuario();

		FacesContext context = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
		usuarioSession = ((Usuario)session.getAttribute("usuarioSession"));
		
		System.out.println("El usuario en sessión es: "+usuarioSession.getUsuario());
    }

	public String getName() {
        return name;
    }

	public List<String> getColumns() {
        return columns;
    }

	public List<Usuario> getAllUsuarios() {
        return allUsuarios;
    }

	public void setAllUsuarios(List<Usuario> allUsuarios) {
        this.allUsuarios = allUsuarios;
    }

	public String findAllUsuarios() {
        allUsuarios = usuarioService.findAllUsuarios();
        dataVisible = !allUsuarios.isEmpty();
        return null;
    }

	public boolean isDataVisible() {
        return dataVisible;
    }

	public void setDataVisible(boolean dataVisible) {
        this.dataVisible = dataVisible;
    }

	
	

	public Usuario getUsuario() {
        if (usuario == null) {
            usuario = new Usuario();
        }
        return usuario;
    }

	public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

	public List<Aviso> getSelectedAvisoes() {
        return selectedAvisoes;
    }

	public void setSelectedAvisoes(List<Aviso> selectedAvisoes) {
        if (selectedAvisoes != null) {
            usuario.setAvisoes(new HashSet<Aviso>(selectedAvisoes));
        }
        this.selectedAvisoes = selectedAvisoes;
    }

	public List<Publicacion> getSelectedPublicacions() {
        return selectedPublicacions;
    }

	public void setSelectedPublicacions(List<Publicacion> selectedPublicacions) {
        if (selectedPublicacions != null) {
            usuario.setPublicacions(new HashSet<Publicacion>(selectedPublicacions));
        }
        this.selectedPublicacions = selectedPublicacions;
    }

	public List<Transaccion> getSelectedTransaccions() {
        return selectedTransaccions;
    }

	public void setSelectedTransaccions(List<Transaccion> selectedTransaccions) {
        if (selectedTransaccions != null) {
            usuario.setTransaccions(new HashSet<Transaccion>(selectedTransaccions));
        }
        this.selectedTransaccions = selectedTransaccions;
    }
/*
	public List<TipoPersona> completeTipoPersona(String query) {
        List<TipoPersona> suggestions = new ArrayList<TipoPersona>();
        for (TipoPersona tipoPersona : tipoPersonaService.findAllTipoPersonas()) {
            String tipoPersonaStr = String.valueOf(tipoPersona.getDescripcion());
            if (tipoPersonaStr.toLowerCase().startsWith(query.toLowerCase())) {
                suggestions.add(tipoPersona);
            }
        }
        return suggestions;
    }
*/
	/*
	public List<TipoPersona> completeTipoPersona(String query) {
        List<TipoPersona> suggestions = new ArrayList<TipoPersona>();
        for (TipoPersona tipoPersona : tipoPersonaService.findAllTipoPersonas()) {
            String tipoPersonaStr = String.valueOf(tipoPersona.getDescripcion());
            if (tipoPersonaStr.toLowerCase().startsWith(query.toLowerCase())) {
            	listaTipoPersona.add(tipoPersona);
            }
        }
        return listaTipoPersona;
    }*/
	
	public List<TipoDocumento> completeTipoDocumento(String query) {
        List<TipoDocumento> suggestions = new ArrayList<TipoDocumento>();
        for (TipoDocumento tipoDocumento : tipoDocumentoService.findAllTipoDocumentoes()) {
            String tipoDocumentoStr = String.valueOf(tipoDocumento.getDescripcion());
            if (tipoDocumentoStr.toLowerCase().startsWith(query.toLowerCase())) {
                suggestions.add(tipoDocumento);
            }
        }
        return suggestions;
    }

	
	public String onEdit() {
        if (usuario != null && usuario.getAvisoes() != null) {
            selectedAvisoes = new ArrayList<Aviso>(usuario.getAvisoes());
        }
        if (usuario != null && usuario.getPublicacions() != null) {
            selectedPublicacions = new ArrayList<Publicacion>(usuario.getPublicacions());
        }
        if (usuario != null && usuario.getTransaccions() != null) {
            selectedTransaccions = new ArrayList<Transaccion>(usuario.getTransaccions());
        }
        return null;
    }
/*
	public boolean isCreateDialogVisible() {
        return createDialogVisible;
    }

	public void setCreateDialogVisible(boolean createDialogVisible) {
        this.createDialogVisible = createDialogVisible;
    }
*/
	public String displayList() {
        //createDialogVisible = false;
        findAllUsuarios();
        return "usuarioDemo";
    }

	public String registrarUsuario() {
        usuario = new Usuario();
        return "usuarioDemo";
    }

	public String persist() {
		
		System.out.println(selectedTipoDocumento.getDescripcion());
		System.out.println(selectedTipoPersona.getDescripcion());
		System.out.println(usuario.getTipoPersona().getDescripcion());
		System.out.println(usuario.getTipoDocumento().getDescripcion());
        String message = "";
        if (usuario.getCodigo() != null) {
            //usuarioService.updateUsuario(usuario);
            message =usuarioService.actualizarUsuario(usuario);
            //message = "Successfully updated";
        } else {
            //usuarioService.saveUsuario(usuario);
        	message = usuarioService.insertarUsuario(usuario);
            //message = "Successfully created";
        }
        
        if (message.equalsIgnoreCase("El usuario se registró exitosamente")) {
            FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, message,"");
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
            reset();
              
            
		} else {
			FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, message,"");
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		}
        
        return findAllUsuarios();
    }

	public String delete() {
        usuarioService.deleteUsuario(usuario);
        FacesMessage facesMessage = new FacesMessage("Successfully deleted");
        FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        reset();
        return findAllUsuarios();
    }

	public void reset() {
        usuario = null;
        selectedAvisoes = null;
        selectedPublicacions = null;
        selectedTransaccions = null;
        selectedTipoDocumento = null;
        selectedTipoPersona = null;
    }

	public void handleDialogClose(CloseEvent event) {
        reset();
    }

	public List<TipoPersona> getListaTipoPersona() {
		return listaTipoPersona;
	}

	
	public List<TipoDocumento> getListaTipoDocumento() {
		return listaTipoDocumento;
	}


	public TipoPersona getSelectedTipoPersona() {
		return selectedTipoPersona;
	}

	public void setSelectedTipoPersona(TipoPersona selectedTipoPersona) {
		this.selectedTipoPersona = selectedTipoPersona;
	}

	public TipoDocumento getSelectedTipoDocumento() {
		return selectedTipoDocumento;
	}

	public void setSelectedTipoDocumento(TipoDocumento selectedTipoDocumento) {
		this.selectedTipoDocumento = selectedTipoDocumento;
	}

	public Usuario getUsuarioSession() {
		return usuarioSession;
	}

	public void setUsuarioSession(Usuario usuarioSession) {
		this.usuarioSession = usuarioSession;
	}

	/***************Listados**********/
	public String getIdTipoPersona() {
		return idTipoPersona;
	}

	public void setIdTipoPersona(String idTipoPersona) {
		if((idTipoPersona.length()> 0 && this.idTipoPersona == null) ||
				   (idTipoPersona.length()> 0 )	) 	fijarTipoPersona(idTipoPersona);
		this.idTipoPersona = idTipoPersona;
	}

	public String getIdTipoDocumento() {
		return idTipoDocumento;
	}

	public void setIdTipoDocumento(String idTipoDocumento) {
		if((idTipoDocumento.length()> 0 && this.idTipoDocumento == null) ||
				   (idTipoDocumento.length()> 0 )	) 	fijarTipoDocumento(idTipoDocumento);
		this.idTipoDocumento = idTipoDocumento;
		
	}

	
	private void llenarCombosUsuario(){
		listaTipoPersona = tipoPersonaService.findAllTipoPersonas();
		listaTipoDocumento = tipoDocumentoService.findAllTipoDocumentoes();
 	}
	
	private void fijarTipoPersona(String idTipoPersona){
		selectedTipoPersona = tipoPersonaService.obtenerTipoPersona(idTipoPersona);
		usuario.setTipoPersona(selectedTipoPersona);
	}
	
	private void fijarTipoDocumento(String idTipoDocumento){
		selectedTipoDocumento = tipoDocumentoService.obtenerTipoDocumento(idTipoDocumento);
		usuario.setTipoDocumento(selectedTipoDocumento);
	}
	
}
